package Synchronized_1;
class DualOperation {
    private final Object lockA = new Object();//对于所有线程都必须是唯一的，也可用static关键字（当这个类会被创建多次时使用static，若只被创建一次，则没有必要）
    private final Object lockB = new Object();

    public void operationA() {
        synchronized(lockA) {
            try {
                Thread.sleep(30); // 模拟操作时间
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + " 完成操作A");
        }
    }

    public void operationB() {
        synchronized(lockB) {
            try {
                Thread.sleep(30); // 模拟操作时间
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + " 完成操作B");
        }
    }
}

public class 使用特定对象锁 {
    public static void main(String[] args) {
        final DualOperation ops = new DualOperation();

        // 创建20个执行操作A的线程
        for (int i = 0; i < 20; i++) {
            new Thread(new Runnable() {
                public void run() {
                    ops.operationA();
                }
            }, "操作A线程-" + i).start();
        }

        // 创建20个执行操作B的线程
        for (int i = 0; i < 20; i++) {
            new Thread(new Runnable() {
                public void run() {
                    ops.operationB();
                }
            }, "操作B线程-" + i).start();
        }
    }
}